package com.lyf.viewapp.gps;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.amap.api.maps.AMap;
import com.amap.api.maps.LocationSource;
import com.amap.api.maps.MapView;
import com.amap.api.maps.UiSettings;
import com.amap.api.maps.model.MyLocationStyle;
import com.lyf.viewapp.R;
import com.lyf.viewapp.util.LogUtils;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

/**
 * 高德地图
 *
 * @author lyf
 */
public class GdMapActivity extends AppCompatActivity implements LocationSource {

    @BindView(R.id.gd_map)
    MapView mMapView;

    private AMap mAMap;
    /**
     * 实现定位-样式
     */
    private MyLocationStyle myLocationStyle;

    /**
     * 是否是中文地图/中英文地址切换
     */
    private boolean isChinese = true;

    /**
     * 定义一个UiSettings对象
     */
    private UiSettings mUiSettings;

    /**
     * 声明AMapLocationClient类对象
     */
    public AMapLocationClient mLocationClient = null;
    /**
     * 声明AMapLocationClientOption对象
     */
    public AMapLocationClientOption mLocationOption = null;
    /**
     * 声明定位回调监听器
     * 可以通过类implement方式实现AMapLocationListener接口，也可以通过创造接口类对象的方法实现
     */
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //可在其中解析amapLocation获取相应内容。
                    LogUtils.showToast(GdMapActivity.this, "x:" + aMapLocation.getLatitude()
                            + "\ny:"+ aMapLocation.getLongitude());
                }else {
                    //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                    Log.e("AmapError","location Error, ErrCode:"
                            + aMapLocation.getErrorCode() + ", errInfo:"
                            + aMapLocation.getErrorInfo());
                }
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gd_map);
        ButterKnife.bind(this);

        //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState)，创建地图
        mMapView.onCreate(savedInstanceState);
        if (mAMap == null) {
            mAMap = mMapView.getMap();
        }
        initMap();

        initUiSet();

        // 3D 地图 SDK中默认会关闭室内地图显示，如有需要可使用类AMap 中的 showIndoorMap(boolean enable)自行开启。
        mAMap.showIndoorMap(true);

        initLocation();
    }

    /**
     * 定位初始化
     */
    private void initLocation() {
        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        //初始化定位
        mLocationClient = new AMapLocationClient(getApplicationContext());

        //设置定位模式为AMapLocationMode.Hight_Accuracy，高精度模式。
        mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);

        //设置定位模式为AMapLocationMode.Battery_Saving，低功耗模式。
        // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Battery_Saving);
        //设置定位模式为AMapLocationMode.Device_Sensors，仅设备模式。
        // mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Device_Sensors);
        //获取一次定位结果：
        //该方法默认为false。
        //mLocationOption.setOnceLocation(true);
        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);
        //设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。
        mLocationOption.setInterval(1000);
        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);
        //设置是否允许模拟位置,默认为true，允许模拟位置
        mLocationOption.setMockEnable(true);
        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
        mLocationOption.setHttpTimeOut(20000);
        //关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);

        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);

        // 设置定位场景，目前支持三种场景（签到、出行、运动，默认无场景）
        mLocationOption.setLocationPurpose(AMapLocationClientOption.AMapLocationPurpose.SignIn);
        if(null != mLocationClient){
            mLocationClient.setLocationOption(mLocationOption);
            //设置场景模式后最好调用一次stop，再调用start以保证场景模式生效
            mLocationClient.stopLocation();
            mLocationClient.startLocation();
        }

    }

    /**
     * 交互控件初始化
     */
    private void initUiSet() {
        // 实例化UiSettings类对象
        mUiSettings = mAMap.getUiSettings();
        // 缩放按钮
        mUiSettings.setZoomControlsEnabled(true);
        // 指南针
        mUiSettings.setCompassEnabled(true);

        //通过aMap对象设置定位数据源的监听
        // mAMap.setLocationSource(this);
        //显示默认的定位按钮
        mUiSettings.setMyLocationButtonEnabled(true);
        // 可触发定位并显示当前位置
        mAMap.setMyLocationEnabled(true);
        //控制比例尺控件是否显示
        mUiSettings.setScaleControlsEnabled(true);

    }

    @OnClick({R.id.normal_map,R.id.navi_map,R.id.night_map,R.id.satellite_map,R.id.off_map,R.id.language_map,R.id.pic_map})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.normal_map:
                // 导航地图
                mAMap.setMapType(AMap.MAP_TYPE_NORMAL);
                break;
            case R.id.navi_map:
                // 夜景地图
                mAMap.setMapType(AMap.MAP_TYPE_NAVI);
                break;
            case R.id.night_map:
                // 白昼地图（即普通地图）
                mAMap.setMapType(AMap.MAP_TYPE_NIGHT);
                break;
            case R.id.satellite_map:
                // 卫星图
                mAMap.setMapType(AMap.MAP_TYPE_SATELLITE);
                break;
            case R.id.off_map:
                // 离线地图
                //在Activity页面调用startActivity启动离线地图组件
                startActivity(new Intent(this.getApplicationContext(),
                        com.amap.api.maps.offlinemap.OfflineMapActivity.class));
                break;
            case R.id.language_map:
                //设置地图底图语言，目前支持中文底图和英文底图
                //language AMap.CHINESE 表示中文，即"zh_cn", AMap.ENGLISH 表示英文，即"en"
                if (isChinese) {
                    mAMap.setMapLanguage(AMap.ENGLISH);
                    isChinese = false;
                } else {
                    mAMap.setMapLanguage(AMap.CHINESE);
                    isChinese = true;
                }
                break;
            case R.id.pic_map:
                // 对地图进行截屏
                mAMap.getMapScreenShot(new AMap.OnMapScreenShotListener() {
                    @Override
                    public void onMapScreenShot(Bitmap bitmap) {

                    }

                    @Override
                    public void onMapScreenShot(Bitmap bitmap, int status) {
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
                        if(null == bitmap){
                            return;
                        }
                        try {
                            FileOutputStream fos = new FileOutputStream(
                                    Environment.getExternalStorageDirectory() + "/test_"
                                            + sdf.format(new Date()) + ".png");
                            boolean b = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                            try {
                                fos.flush();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            try {
                                fos.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            StringBuffer buffer = new StringBuffer();
                            if (b) {
                                buffer.append("截屏成功 ");
                            } else {
                                buffer.append("截屏失败 ");
                            }
                            if (status != 0) {
                                buffer.append("地图渲染完成，截屏无网格");
                            } else {
                                buffer.append( "地图未渲染完成，截屏有网格");
                            }
                            LogUtils.showToast(getApplicationContext(), buffer.toString());

                        } catch (FileNotFoundException e) {
                            e.printStackTrace();
                        }

                    }
                });

                break;
                default:break;
        }
    }

    private void initMap() {
        //初始化定位蓝点样式类myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);//连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。（1秒1次定位）如果不设置myLocationType，默认也会执行此种模式。
        myLocationStyle = new MyLocationStyle();
        //设置连续定位模式下的定位间隔，只在连续定位模式下生效，单次定位模式下不会生效。单位为毫秒。
        myLocationStyle.interval(2000);

        // 只定位一次。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_SHOW);
        // 定位一次，且将视角移动到地图中心点。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE) ;
        // 连续定位、且将视角移动到地图中心点，定位蓝点跟随设备移动。（1秒1次定位）
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW) ;
        // 连续定位、且将视角移动到地图中心点，地图依照设备方向旋转，定位点会跟随设备移动。（1秒1次定位）
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE);
        //连续定位、且将视角移动到地图中心点，定位点依照设备方向旋转，并且会跟随设备移动。（1秒1次定位）默认执行此种模式。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
        //以下三种模式从5.1.0版本开始提供
        //连续定位、蓝点不会移动到地图中心点，定位点依照设备方向旋转，并且蓝点会跟随设备移动。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER);
        //连续定位、蓝点不会移动到地图中心点，并且蓝点会跟随设备移动。
        //myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER);
        //连续定位、蓝点不会移动到地图中心点，地图依照设备方向旋转，并且蓝点会跟随设备移动。
        myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_MAP_ROTATE_NO_CENTER);

        //方法自5.1.0版本后支持
        //设置是否显示定位小蓝点，用于满足只想使用定位，不想使用定位小蓝点的场景，设置false以后图面上不再有定位蓝点的概念，但是会持续回调位置信息。
        myLocationStyle.showMyLocation(true);

        //定位蓝点图标自定义
        //设置定位蓝点的icon图标方法，需要用到BitmapDescriptor类对象作为参数。
        //myLocationStyle.myLocationIcon(BitmapDescriptor myLocationIcon);

        //自定义定位蓝点图标的锚点：
        // 设置定位蓝点图标的锚点方法。
        //myLocationStyle.anchor(float u, float v);

        //设置定位蓝点精度圆圈的边框颜色的方法。
        myLocationStyle.strokeColor(R.color.transparent);
        //设置定位蓝点精度圆圈的填充颜色的方法。
        myLocationStyle.radiusFillColor(R.color.transparent);
        //设置定位蓝点精度圈的边框宽度的方法。
        myLocationStyle.strokeWidth(1F);

        //设置定位蓝点的Style
        mAMap.setMyLocationStyle(myLocationStyle);
        // 设置默认定位按钮是否显示，非必需设置。
        mAMap.getUiSettings().setMyLocationButtonEnabled(true);
        // 设置为true表示启动显示定位蓝点，false表示隐藏定位蓝点并不进行定位，默认是false。
        mAMap.setMyLocationEnabled(true);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //销毁定位客户端，同时销毁本地定位服务。
        mLocationClient.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy()，销毁地图
        mMapView.onDestroy();
    }
    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView.onResume ()，重新绘制加载地图
        mMapView.onResume();
    }
    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView.onPause ()，暂停地图的绘制
        mMapView.onPause();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState)，保存地图当前的状态
        mMapView.onSaveInstanceState(outState);
    }

    @Override
    public void activate(OnLocationChangedListener onLocationChangedListener) {

    }

    @Override
    public void deactivate() {

    }
}
